<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<title>单体模式</title>
</head>
<body>
<script type="text/javascript">
	
	// 单体模式(Singleton)

	// 1、简单单体模式
	/*
	var Singleton = {
		arrt1: true,
		arrt2: 10,
		method1: function () {
			alert('method1');
		},
		method2: function () {
			alert('method2');
		}
	}

	Singleton.method2();
	*/

	// 补充：划分命名空间(区分代码)
	/*
	var Jerry = {};

	Jerry.Singleton = {
		arrt1: true,
		arrt2: 10,
		method1: function () {
			alert('method1');
		},
		method2: function () {
			alert('method2');
		}
	}

	Jerry.Singleton.method1();
	*/

	// 2、 闭包单体模式(保护数据)；
	/*
	var Jerry = {};

	Jerry.Singleton = (function () {
		// 私有成员变量
		var arrt1 = true;
		var arrt2 = 10;
		// 公共方法
		return {
			getArrt1: function () {
				alert(arrt1);
			},
			getArrt2: function () {
				alert(arrt2);
			}
		}
	})();

	Jerry.Singleton.getArrt1();
	*/

	// 惰性单体
	/*
	var Jerry = {};

	Jerry.Singleton = (function () {

		var uniqueInstance;

		function init() {
			// 私有成员变量
			var arrt1 = true;
			var arrt2 = 10;
			// 公共方法
			return {
				getArrt1: function () {
					alert(arrt1);
				},
				getArrt2: function () {
					alert(arrt2);
				}
			}
		}

		return {
			getInstance: function () {
				if(!uniqueInstance){
					uniqueInstance = init();
				}
				return uniqueInstance;
			}
		}

	})()

	Jerry.Singleton.getInstance().getArrt1();
	*/

	// 分支单体(判断程序的分支<浏览器的差异检测>)

	var Jerry = {};
	var someCondition = true;	//浏览器
	Jerry.Singleton = (function () {
		var obj1 = {
			attr : 'IE'
		};
		var obj2 = {
			attr : 'FF'
		}
		return someCondition ? obj1 : obj2;
	})()

	alert(Jerry.Singleton.attr);



</script>
</body>
</html>